# 作者：陈睿-cruise
# 2025年02月18日12时50分54秒
# 2979386061@qq.com
import socket

# 作者：陈睿-cruise
# 2025年02月18日10时05分45秒
# 2979386061@qq.com

# 编写程序执行入口
if __name__ == '__main__':
    # 创建套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 端口复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 绑定到本机的 IP 地址 127.0.0.1 和端口号 9002
    tcp_server_socket.bind(('127.0.0.1', 9002))

    # 开始监听客户端连接，最大连接数为 128
    tcp_server_socket.listen(128)

    print("服务器已启动，等待客户端连接...")

    while True:
        # 等待客户端连接
        client_socket, client_address = tcp_server_socket.accept()
        print(f"已连接到客户端：{client_address}")

        try:
            # 接收客户端发送的数据
            data = client_socket.recv(1024)
            if not data:
                print(f"客户端 {client_address} 已关闭连接")
                client_socket.close()
                continue

            # 解析请求路径
            request_data = data.decode('utf-8')
            request_lines = request_data.splitlines()
            if len(request_lines) == 0:
                client_socket.close()
                continue

            # 获取请求路径
            path = request_lines[0].split()[1]
            if path == '/':
                path = '/index.html'  # 默认返回 index.html

            # 构造文件路径
            file_path = 'html' + path

            # 读取文件内容
            try:
                with open(file_path, 'rb') as f:
                    body = f.read()
            except FileNotFoundError:
                # 文件不存在，返回 404 错误
                line = 'HTTP/1.1 404 Not Found\r\n'
                head = 'Server: binzi\r\n'
                body = b'<h1>404 Not Found</h1>'
            else:
                # 文件存在，返回 200 OK
                line = 'HTTP/1.1 200 OK\r\n'
                head = 'Server: binzi\r\n'

            # 构造响应报文
            response_data = line + head + "\r\n"
            client_socket.send(response_data.encode('utf-8'))
            client_socket.send(body)

        except Exception as e:
            print(f"处理客户端 {client_address} 时发生错误：{e}")

        finally:
            # 关闭与客户端的连接
            client_socket.close()

    # 关闭服务器的监听套接字（通常不会执行到这里）
    tcp_server_socket.close()